 /*
    *  Copyright 2004 Thevert Liu  <thevert.liu@gmail.com>
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
    *  You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
   *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */

#ifndef X2_XMLREADERPARSER_H 
#define X2_XMLREADERPARSER_H 

#include <XMLReader.h>
#include "XMLShell.h"
#include "XMLParser.h"

class Reader
{
public:
    Reader(IXMLReader& reader, IXMLShell& shell) ;
    
    bool marshall() ;

private:    
    bool handleAttributes() ;

    bool handleExtra() ;

    bool handleElements(int depth) ;

    bool handleElement(const std::string& tagName) ;

    int handleAttribute(IXMLShell::AttributeNode& node) ;
    
    bool handleValue() ;
    
    IXMLReader&  mReader ;
    IXMLShell& mShell ;
} ;

class Writer
{
public:
    Writer(IXMLElement& element, std::ostream& os) ;
    bool write() ;
private:
    bool handleAttributes() ;
    bool handleExtra() ;
    bool handleElements() ;
    bool handleValue() ;
    
    int handleAttribute(IXMLShell::AttributeNode& node) ;
    int handleXMLElement(IXMLElement* elem) ;
    int handleElement(IXMLShell::ElementNode& node) ;
    
    IXMLElement& mElement ;
    XMLShell mShell ;
    std::ostream& mOS ;    
} ;


class XMLReaderParser: public IXMLParser
{
public:
    virtual bool parse(const std::string & xmlBody, 
                       const std::string& name, 
                       IXMLElement& result, 
                       std::string& error, 
                       XMLContext* ctx) ;
                       
    virtual bool toXML(IXMLElement& root, 
                       std::ostream& os, 
                       XMLContext* ctx) ;
    
    static void setXMLReaderCreator(ICreator<IXMLReader>::CreateFunc func) 
    {
        mCreate = func ;
    };

    
private:
    static ICreator<IXMLReader>::CreateFunc mCreate ;    
    
} ;

#endif // X2_XMLREADERPARSER_H

